# -*- coding:utf-8 -*-
# 北梦测教育
# 课程咨询加微信：xiaobeiceshi

# 数据预处理器

import ddddocr
from PIL import Image
import base64
from io import BytesIO
from utils.get_keywords import GetKeywords
import requests
import os


# 因为登录失败是因为验证码的问题导致的，所有单独对登录失败进行失败重试是达不到效果的
# 想要实现我现在把整个获取验证码的逻辑作为一个预处理器

# 验证码的逻辑需要处理为多个环境区分的
def get_auth_captcha():
    """请求验证码接口获取数据"""
    payload = {
        "method": "get",
        "url": os.environ["URL"] + "/auth/captcha"
    }
    response = requests.request(**payload).json()

    sn = GetKeywords.get_keyword(response, "sn")
    image = GetKeywords.get_keyword(response, "image")

    return sn, image


def dddd_ocr_text():
    """
    进行OCR识别的函数
    :return: 识别之后的文本
    """
    sn, data = get_auth_captcha()

    # 分割data文本，得到头部信息和 Base64编码部分
    encode_data = data.split(",")[1]

    # 解码 Base64 元数据
    decode_data = base64.b64decode(encode_data)

    # 把解码数据调整为图像数据
    image = Image.open(BytesIO(decode_data))

    # 把图像数据转成字节数据
    image_bytes = BytesIO()
    image.save(image_bytes, format="PNG")
    image_bytes = image_bytes.getvalue()

    # 初始化
    ocr = ddddocr.DdddOcr()
    text = ocr.classification(image_bytes)

    return sn, text


# 用于存下全局的验证码和sn
sn_text = {}

# 用于表示次数来控制失败重试的时候会执行代码
run_nums = 0


def get_res_sn_text():
    """
    调用识别来获取sn和验证码
    通过去全局变量sn_text的控制来实现只去调用一次dddd_ocr_text
    """
    # 判断全局变量为空的时候才会去调用dddd_ocr_text函数
    global run_nums
    if not sn_text or run_nums % 2 == 0:
        sn, text = dddd_ocr_text()
        sn_text["sn"] = sn
        sn_text["text"] = text


    # 每次执行 +1
    run_nums += 1

    return sn_text


if __name__ == '__main__':
    print(dddd_ocr_text())
    # import requests
    #
    # requests.get()
